import router from '@/router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // 类似youtube、Medium等网站上的小进度条插件
import 'nprogress/nprogress.css'
import { getToken } from '@/utils/auth'
import { getPageTitle } from '@/utils/get-page-title'

NProgress.configure({ showSpinner: false }) // NProgress Configuration
const whiteList = ['/login'] // 路由白名单
router.beforeEach(async(to, from, next) => {
  NProgress.start()
  if (to.meta.title) {
    document.title = getPageTitle(to.meta.title)
  }
  const hasToken = getToken()
  if (hasToken) {
    if (to.path === '/login') {
      next({ path: '/' })
      NProgress.dong()
    } else {
      const hasRoles = store.getters.roles && store.getters.roles.length > 0
      if (hasRoles) {
        next()
      } else {
        try {
          const { roles } = await store.dispatch('user/getInfo')
          await store.dispatch('permission/generateRoutes', roles).then(accessRoutes => {
            for (let i = 0, length = accessRoutes.length; i < length; i += 1) {
              const element = accessRoutes[i]
              router.addRoute(element)
            }
          })
          router.options.isAddAsycnMenuData = true
          next({ ...to, replace: true })
        } catch (error) {
          await store.dispatch('user/resetToken')
          Message.info(error)
          next(`/login?redirect=${to.path}`)
          NProgress.done()
        }
      }
    }
  } else {
    if (whiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})

// afterEach是路由跳转后执行的
router.afterEach(() => {
  // finish progress bar
  NProgress.done()
})

// 路由守卫 ，beforeEach是路由跳转前执行的，
// router.beforeEach(async (to, from, next) => {
//   NProgress.start()
//   // document.title = getPageTitle(to.meta.title)
//   //  设置title显示
//   // 获取用户登陆的token
//   const hasToken = getToken()
//   if (hasToken){
//     if (to.path === "login") {
//       // 如果已登录，重定向回首页
//       next({ path: "/" })
//       NProgress.dong()
//     } else {
//       // 确定用户是否已通过getInfo获得其权限角色
//       const hasRoles = store.getters.roles && store.getters.roles.length > 0
//       if (hasRoles) {
//         next()
//       } else {
//         try {
//           // 获取用户信息
//           const { roles } = await store.dispatch("user/getInfo")
//           // 角色可以访问的路由
//           const accessRoutes = await store.dispatch("permission/generateRoutes", roles)
//           // 动态添加可以访问的路由
//           router.addRoutes(accessRoutes)

//           //hack方法以确保addRoutes是完整的
//           //设置replace:true，这样导航将不会留下历史记录
//           next({...to, replace: true})
//         } catch (error) {
//           // 删除token并转到登录页
//           await store.dispatch('user/resetToken')
//           Message.info(error)
//           next(`/login?redirect=${to.path}`)
//           NProgress.done()
//         }
//       }
//     }
//   } else {
//     // 没有token
//     if (whiteList.indexOf(to.path) !== -1){
//       // 在白名单中，直接进入
//       next()
//     } else {

//       // 没有访问权限的其他页面将重定向到登录页面。
//       next(`/login?redirect=${to.path}`)
//       NProgress.done()
//     }
//   }
// })
